#ifndef __TCP_SERVER_H__
#define __TCP_SERVER_H__
#pragma once

// Standard C++ headers
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <atomic>
#include <thread>
#include <mutex>
#include <functional>
#include <csignal>

// Poco headers
#include <Poco/Net/ServerSocket.h>
#include <Poco/Net/StreamSocket.h>
#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/DatagramSocket.h>
#include <Poco/Exception.h>

// Project headers
#include "zlog.h"

// Using declarations (optional, keep minimal)
using std::function;
using std::lock_guard;
using std::mutex;
using std::shared_ptr;
using std::string;
using std::thread;
using std::unique_ptr;
using std::vector;

using Poco::Exception;
using Poco::Net::DatagramSocket;
using Poco::Net::ServerSocket;
using Poco::Net::SocketAddress;
using Poco::Net::StreamSocket;
class SingleClientTcpServer
{
public:
    using DataCallback = std::function<void(std::vector<uint8_t> &)>;

    /**
     * @brief 构造函数
     * @param port 监听端口
     * @param onDataReceived 数据接收回调（可选）
     */
    SingleClientTcpServer(int port, DataCallback onDataReceived = nullptr);

    // 禁止拷贝
    SingleClientTcpServer(SingleClientTcpServer &) = delete;
    SingleClientTcpServer &operator=(const SingleClientTcpServer &) = delete;

    ~SingleClientTcpServer();

    /**
     * @brief 启动服务器（在后台线程运行）
     */
    void start();

    /**
     * @brief 停止服务器
     */
    void stop();

    /**
     * @brief 发送数据
     * @param data 要发送的数据
     * @return 成功发送的字节数，失败返回 -1
     */
    int sendData(const std::vector<uint8_t> &data);

    /**
     * @brief 设置数据接收回调
     */
    void setOnDataReceived(DataCallback cb);
    /**
     * @brief 处理事件更新
     */
    void process_event_update(void);

private:
    void run();

    void processClientData();

private:
    int _port;
    ServerSocket _serverSocket; // 栈对象，自动管理资源（RAII）
    std::thread _workerThread;  // 使用 std::thread

    // mutable std::mutex _socketMutex;
    StreamSocket _clientSocket; // 栈对象
    std::atomic<bool> _clientConnected;
    std::atomic<bool> _running;

    DataCallback _onDataReceived;
    zlog_category_t *modbus = nullptr;
};
int sendUdp(const std::string &ip,
            unsigned short port,
            const void *buffer,
            int length);
#endif
